package com.flying.test1;

import javax.lang.model.SourceVersion;

/**
 * @author 刘鹏飞
 * @ClassName GenericMethod
 * @Date 2024/12/23 23:25
 * @Created by 刘鹏飞
 * @Description 泛型方法
 *
 * 类上定义的泛型，在方法中也可以使用。但是，我们经常需要仅仅在某一个方法上使用泛型，这时候可以使用泛型方法。
 * 调用泛型方法时，不需要像泛型类那样告诉编译器是什么类型，编译器可以自动推断出类型
 *  TODO:
 *   语法结构
 *   // 无返回值
 *   public <泛型标识符> void getName(泛型标识符 name){}
 *   // 有返回值
 *   public <泛型标识符> 泛型标识符 getName(泛型标识符 name){}
 *  静态泛型方法:
 *    静态泛型方法无法使用类上定义的泛型,必须要将泛型定义在方法上
 *      原因: 因为静态方法是从属于类的,二泛型是在类实例化或者调用具体的泛型方法时才被确认下来.在类初始化时,类的泛型是不明确的.所以不能使用.
 *    public static <泛型标识符> void  setName(泛型标识符 name){}
 *    public static <泛型标识符> 泛型标识符 getName(泛型标识符 name){}
 *
 * 类型推断
 *
 */
public class GenericMethod /*<M>*/ {

    public <T> void setName(T name){
        System.out.println("GenericMethod.setName");
        System.out.println("name = " + name);
    }


    public <T> T getAge(T age){
        System.out.println("GenericMethod.getAge");
        return age;
    }


    //  静态泛型方法
//    public static  void  setNameStatic(M name){
//        System.out.println("GenericMethod.setNameStatic");
//        System.out.println("name = " + name);
//    }

    public static  <T> T getAgeStatic(T age){
        System.out.println("GenericMethod.getAgeStatic");
        return age;
    }


    /**
     * 泛型方法中的可变参数
     *
     * 语法结构:
     *  public <泛型标识符> void getHobbies(泛型标识符 ... args){}
     */
    public <T> void getHobbies(T ... hobbies){

        for (T hobby : hobbies) {
            System.out.println("hobby = " + hobby);
        }
    }

}
